package com.zjl.学习.第02章_作业对象Job;

import com.zjl.springbatch.util.OutColour;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.annotation.AfterJob;
import org.springframework.batch.core.annotation.BeforeJob;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.stereotype.Component;

/**
 * 执行前：一般用于初始化操作， 作业执行前需要着手准备工作，
 *          比如：各种连接建立，线程池初始化等。
 * 执行后：业务执行完后，需要做各种清理动作，比如释放资源等。
 *
 * 有继承接口
 * @see org.springframework.batch.core.JobExecutionListener
 * 再 .listener(new MyJobExecutionListener()) 放入job中
 * 也有注解方式
 * @BeforeJob//在 job执行前执行
 * @AfterJob//在 job执行后执行
 *
 */
public class E_作业监听器JobExecutionListener {
    public static void main(String[] args) {
        //用法
        JobBuilderFactory jobBuilderFactory = new JobBuilderFactory(null);
        jobBuilderFactory.get("作业增量参数")
                .start((Step) null)
                .next((Step) null)
                .incrementer(new MyParamIncrementer())//放入自定义的 参数方法
                //放入 作业执行侦听器  会在Job执行前后执行
                .listener(new MyJobExecutionListener())
                .build();
    }
}
@Component//放入 bean
class MyJobExecutionListener implements JobExecutionListener{

    @Override//在 job执行前执行
    public void beforeJob(JobExecution jobExecution) {
        long begin = System.currentTimeMillis();
        OutColour.out.printlnRed("**********************【接口作业执行侦听器 开始时间】" + begin + "************************");
        ExecutionContext executionContext = jobExecution.getExecutionContext();
        //获取执行的当前时间
        executionContext.putLong("begin",System.currentTimeMillis());

    }

    @Override//在 job执行后执行
    public void afterJob(JobExecution jobExecution) {
        long end = System.currentTimeMillis();
        ExecutionContext executionContext = jobExecution.getExecutionContext();
        long begin = executionContext.getLong("begin");

        System.out.println("总时间：" + (end-begin));
        OutColour.out.printlnRed("**********************【接口作业执行侦听器 开始时间】" + end + "************************");
        OutColour.out.printlnRed("**********************【整个作业时间 总耗时间】" + (end-begin) + "************************");

    }
}

@Component//放入 bean //注解方式 实现监听器
class MyAnnotateJobExecutionListener{

    @BeforeJob//在 job执行前执行
    public void beforeJob(JobExecution jobExecution) {
        long begin = System.currentTimeMillis();
        OutColour.out.printlnRed("**********************【注解作业执行侦听器 开始时间】" + begin + "************************");
        ExecutionContext executionContext = jobExecution.getExecutionContext();
        //获取执行的当前时间
        executionContext.putLong("begin",System.currentTimeMillis());//将数据放入 job 的共享数据

    }

    @AfterJob//在 job执行后执行
    public void afterJob(JobExecution jobExecution) {
        long end = System.currentTimeMillis();
        ExecutionContext executionContext = jobExecution.getExecutionContext();
        long begin = executionContext.getLong("begin");

        System.out.println("总时间：" + (end-begin));
        OutColour.out.printlnRed("**********************【注解作业执行侦听器 开始时间】" + end + "************************");
        OutColour.out.printlnRed("**********************【整个作业时间 总耗时间】" + (end-begin) + "************************");

    }
}
